{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [],
   "source": [
    "def NaiveteBayes(T, y, a, Y, x, lam=0):\n",
    "    # 计算先验概率\n",
    "    prepro = {}\n",
    "    for yRange in Y:\n",
    "        #print (yRange, Y[Y==yRange].shape[0], )\n",
    "        prepro[yRange] = (y[y==yRange].shape[0]+lam)/(y.shape[0]+lam*Y.shape[0])\n",
    "    print('先验概率：',prepro)\n",
    "    # 计算条件概率\n",
    "    conpro = {}\n",
    "    for i in range(len(a)):  # 遍历每个特征\n",
    "        for j in a[i]: # 遍历特征的每个取值\n",
    "            for k in Y:\n",
    "                numerator = X[(y==k)&(X[:,i]==j),:].shape[0]+lam\n",
    "                denominator = X[y==k,:].shape[0]+lam*a[i].shape[0]\n",
    "                conpro[(i,j, k)] = numerator/denominator\n",
    "                # print (i,j,k,numerator, denominator)\n",
    "    print('条件概率：',conpro)\n",
    "    # 计算后验概率的分子\n",
    "    postpro = {}\n",
    "    for yRange in Y:\n",
    "        pro = 1\n",
    "        for i in range(x.shape[0]):\n",
    "            pro = pro * conpro[(i, x[i], yRange)]\n",
    "            print (conpro[(i, x[i], yRange)])\n",
    "        postpro[yRange] = pro * prepro[yRange]\n",
    "    print ('后验概率', postpro)\n",
    "    # 确定X的分类\n",
    "    import operator\n",
    "    return sorted(postpro.items(),   # iterable -- 可迭代对象，在python2中使用A.iteritems()，在python3中使用A.items()\n",
    "           key=operator.itemgetter(1),   # key -- 主要是用来进行比较的元素，指定可迭代对象中的一个元素来进行排序，这里指基于item的value进行排序\n",
    "           reverse=True)[0][0]   # reverse -- 排序规则，reverse = True 降序 ， reverse = False 升序（默认）。\n",
    "# 排序结果是一个list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "先验概率： {-1: 0.4, 1: 0.6}\n",
      "条件概率： {(0, '1', -1): 0.5, (0, '1', 1): 0.2222222222222222, (0, '2', -1): 0.3333333333333333, (0, '2', 1): 0.3333333333333333, (0, '3', -1): 0.16666666666666666, (0, '3', 1): 0.4444444444444444, (1, 'S', -1): 0.5, (1, 'S', 1): 0.1111111111111111, (1, 'L', -1): 0.16666666666666666, (1, 'L', 1): 0.4444444444444444, (1, 'M', -1): 0.3333333333333333, (1, 'M', 1): 0.4444444444444444}\n",
      "0.3333333333333333\n",
      "0.5\n",
      "0.3333333333333333\n",
      "0.1111111111111111\n",
      "后验概率 {-1: 0.06666666666666667, 1: 0.02222222222222222}\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "-1"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = np.array([[1, 'S'], [1, 'M'], [1, 'M'], [1, 'S'], [1, 'S'],\n",
    "              [2, 'S'], [2, 'M'], [2, 'M'], [2, 'L'], [2, 'L'],\n",
    "              [3, 'L'], [3, 'M'], [3, 'M'], [3, 'L'], [3, 'L']])\n",
    "y = np.array([-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1])\n",
    "a = np.array([np.array([1,2,3]),np.array(['S','L','M'])])\n",
    "Y = np.array([-1, 1])\n",
    "x = np.array([2, 'S'])\n",
    "NaiveteBayes(X, y, a, Y, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "先验概率： {-1: 0.4117647058823529, 1: 0.5882352941176471}\n",
      "条件概率： {(0, '1', -1): 0.4444444444444444, (0, '1', 1): 0.25, (0, '2', -1): 0.3333333333333333, (0, '2', 1): 0.3333333333333333, (0, '3', -1): 0.2222222222222222, (0, '3', 1): 0.4166666666666667, (1, 'S', -1): 0.4444444444444444, (1, 'S', 1): 0.16666666666666666, (1, 'L', -1): 0.2222222222222222, (1, 'L', 1): 0.4166666666666667, (1, 'M', -1): 0.3333333333333333, (1, 'M', 1): 0.4166666666666667}\n",
      "0.3333333333333333\n",
      "0.4444444444444444\n",
      "0.3333333333333333\n",
      "0.16666666666666666\n",
      "后验概率 {-1: 0.061002178649237467, 1: 0.032679738562091505}\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "-1"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "NaiveteBayes(X, y, a, Y, x, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
